package main

import "fmt"

// func Test() {
// 	for i := 1; i <= 100; i++ {
// 		fmt.Println("子routinue-", i)
// 	}
// 	fmt.Println("子协程结束...")
// }

// func main() {
// 	go Test()

// 	for i := 1; i <= 100; i++ {
// 		fmt.Println("主routinue-", i)
// 	}
// 	fmt.Println("主协程结束")
// 	time.Sleep(3 * time.Second)
// }

// func main() {
// 	fmt.Println(runtime.GOROOT())
// 	fmt.Println(runtime.GOOS)
// 	fmt.Println(runtime.NumCPU())

// }
// var wg sync.WaitGroup

// func main() {
// 	wg.Add(1)
// 	go fun1()
// 	wg.Add(1)
// 	go fun2()
// 	wg.Wait()
// 	fmt.Println("main over")
// }

// func fun1() {
// 	defer wg.Done()

// 	for i := 1; i <= 10; i++ {
// 		fmt.Println("fun1-", i)
// 	}
// }

// func fun2() {
// 	defer wg.Done()

// 	for i := 1; i <= 10; i++ {
// 		fmt.Println("fun2-", i)
// 	}
// }

// 以互斥锁的方式,访问临界资源
// var wg sync.WaitGroup
// var ticket = 10000
// var mutex sync.Mutex

// func GetTicket() {
// 	defer wg.Done()

// 	for {
// 		func() {
// 			mutex.Lock()
// 			defer mutex.Unlock()
// 			if ticket <= 0 {
// 				fmt.Println("没票了")
// 				//mutex.Unlock()
// 				return
// 			}
// 			fmt.Println("抢到票了,剩余票=", ticket)
// 			time.Sleep(time.Microsecond)
// 			ticket--

// 			// mutex.Unlock()
// 		}()
// 	}
// }

// func main() {
// 	for i := 1; i <= 3; i++ {
// 		wg.Add(1)
// 		go GetTicket()
// 	}
// 	wg.Wait()
// }

// var rwMutex *sync.RWMutex
// var wg *sync.WaitGroup

// func main() {
// 	rwMutex = new(sync.RWMutex)
// 	wg = new(sync.WaitGroup)
// 	for i := 1; i <= 3; i++ {
// 		wg.Add(1)
// 		go readData(i)
// 	}

// 	wg.Wait()
// }

// func writeData(i int) {
// 	defer wg.Done()
// 	rwMutex.Lock()
// 	fmt.Println("正在写...", i)
// 	time.Sleep(3 * time.Second)
// 	rwMutex.Unlock()

// }

// func readData(i int) {
// 	defer wg.Done()
// 	rwMutex.RLock()
// 	fmt.Println("正在读...", i)
// 	time.Sleep(500 * time.Millisecond)
// 	rwMutex.RUnlock()
// }

// var (
// 	wg          sync.WaitGroup
// 	rwMutex     sync.RWMutex
// 	readerCount int
// 	data        int
// )

// func reader(id int) {
// 	defer wg.Done()
// 	//读者读三次
// 	for i := 1; i <= 3; i++ {
// 		rwMutex.RLock()
// 		readerCount++
// 		fmt.Printf("读者%d 开始读取数据: %d (当前读者数量:%d)\n", id, data, readerCount)
// 		time.Sleep(50 * time.Millisecond)
// 		readerCount--
// 		rwMutex.RUnlock()
// 		time.Sleep(100 * time.Millisecond)
// 	}
// }

// func writer(id int) {
// 	defer wg.Done()
// 	//写者写三次
// 	for i := 1; i <= 2; i++ {
// 		rwMutex.Lock()
// 		fmt.Printf("=====写者%d 写数据 ====\n", id)
// 		time.Sleep(100 * time.Millisecond)
// 		data++
// 		fmt.Printf("=====写者%d 写入数据%d ====\n", id, data)

// 		rwMutex.Unlock()
// 		time.Sleep(200 * time.Millisecond)
// 	}
// }

// func main() {
// 	wg.Add(5)
// 	go reader(1)
// 	go reader(2)
// 	go reader(3)
// 	go writer(1)
// 	go writer(2)
// 	wg.Wait()
// 	fmt.Println("退出...")
// }

func main() {
	channel := make(chan int)
	for i := 1; i <= 10; i++ {
		channel <- i
	}

	for i := 1; i <= 10; i++ {
		fmt.Println(<-channel)
	}

}
